package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"lhgbackDBTool/backHelper"
	"lhgbackDBTool/utils"
	"time"
)

//数据库备份工具入口

/*
单台数据库服务器，多数据库实例同时备份
多数据库实例备份 开启 goroutine 执行备份操作

1. 同时支持linux平台和windows平台
要求：mysql client 8.x
2. 注意windows平台和linux平台的 备份命令 mysqldump 要特别注意
3.可配置 定时执行

*/

/*
2021-4-17 23:00
完成windows平台用户的基本使用需求

*/

func main() {

	fmt.Println("Mysql备份服务已启动...")
	//cron定时任务库基本使用
	//初始化实例
	//c := cron.New()
	//当需要指定时间点执行任务，需要指定时区
	c := cron.New(cron.WithLocation(time.Local))
	//启动,注意c.Start()是启动了一个新的goroutine,所以你必须确保这个goroutine启动之前，main主程不能已经执行完了
	//轮询备份
	if utils.PollingBackEnable {
		//1.添加任务（指定间隔时间轮询执行）
		str := fmt.Sprintf("@every %dh%dm%ds", utils.Hour, utils.Min, utils.Second)
		c.AddFunc(str, backDB)
	}

	//定点备份
	if utils.PointBackEnable {
		//2.添加任务（指定时间点执行）(每天23点21分执行)
		str := fmt.Sprintf("%v %v %v %v %v", utils.Minutes, utils.Hours, utils.DayOfMonth, utils.Month, utils.DayOfWeek)
		//"45 20 * * *"
		c.AddFunc(str, backDB)
	}
	//判断
	if utils.PointBackEnable || utils.PollingBackEnable {
		c.Start()
	}

	for {
		time.Sleep(time.Second)
	}
}

/**
备份
*/
func backDB() {

	if len(utils.DbPassWords) == 0 || len(utils.DbNames) == 0 {
		fmt.Println("数据库实例名称或数据库密码未配置,请检查!")
	}
	if len(utils.DbNames) != len(utils.DbPassWords) {
		fmt.Println("当前配置的数据库实例名称数量和数据库密码数量不相等,请检查!")
	}

	for i := 0; i < len(utils.DbNames); i++ {
		//循环启动 goroutine
		go backHelper.BackInWindows(utils.DbPassWords[i], utils.DbNames[i])
	}
}
